// 运行

import Executor from "../../executor";

export default (main:Executor,id: string, c: any) => {
    // 上层 context [包含父级和全局的 context]
    const data = main.getCellData(id);
    //
    // if (name != 'loop') throw new Error('节点类型不正确，请检查：' + JSON.stringify(d));
    const { ctx, exp } = data;
    // 局部 context
    const context = main.createContext(c,ctx)
    // 找出起始节点
    const sids = main.startNodes[id];
    // 解析 exp 表达式
    const reg = /^\s*(.*?)\s+(in|of)\s+(.*?)\s*$/
    //
    const regRes = reg.exec(exp) || [];
    // 异常数据，终止
    if(!regRes[3]){return false;}
    const list = /^\d+$/.test(regRes[3]) ? new Array(Number(regRes[3])).fill(1) : main.eval(regRes[3],context)
    const keys:string[] = /^\(/.test(regRes[1]) ? (/^\(\s*(.*?)\s*\.\s*(.*?)\s*\)$/.exec(regRes[1])?.filter((k, i) => i == 1 || i == 2) || []) : [regRes[1]]
    let flag = true;
    // 循环体
    for (let i = 0, l = list.length; i < l; i++) {
        if(flag === false) break;
        const item = list[i]
        //
        const ek = regRes[2] == 'in' ? keys[0] : undefined;
        const ik = regRes[2] == 'of' ? keys[0] : keys[1];
        //
        if(ek){
            context[ek] = item;
        }
        if(ik){
            context[ik] = i;
        }
        // 执行流
        for(const id of sids){
            const res = main.Cells.run(id,context)
            if(res === false){
                flag = false;
                break;
            }
        }

    }
    // 继续执行后面的节点 并且重置作用域
    return main.Cells.next(id,c)


}